home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Metric.C < prev    next >
C/C++ Source or Header  |  1990-12-20  |  3KB  |  138 lines

  1. //$MetricClass$
  2.  
  3. #include "Metric.h"
  4. #include "Class.h"
  5. #include "String.h"
  6.  
  7. SimpleMetaImpl(Metric)
  8. {
  9.     Metric *m= (Metric*) addr;
  10.     sprintf(buf, "w: %d  h: %d  b: %d", m->extent.x, m->extent.y, m->base);
  11. }
  12.  
  13. Metric::Metric()
  14. {
  15.     extent.x= extent.y= base= 0;
  16. }
  17.  
  18. Metric::Metric(Point e, short b)
  19. {
  20.     extent= e;
  21.     base= b;
  22. }
  23.  
  24. Metric::Metric(Point e)
  25. {
  26.     extent= e;
  27.     base= extent.y;
  28. }
  29.  
  30. Metric::Metric(int w)
  31. {
  32.     extent.x= extent.y= w;
  33.     base= w;
  34. }
  35.  
  36. Metric::Metric(int w, int h)
  37. {
  38.     extent.x= w;
  39.     base= extent.y= h;
  40. }
  41.     
  42. Metric::Metric(int w, int h, int b)
  43. {
  44.     extent.x= w;
  45.     extent.y= h;
  46.     base= b;
  47. }
  48.  
  49. Metric::Metric(const Metric &m)
  50. {
  51.     extent.x= m.extent.x;
  52.     extent.y= m.extent.y;
  53.     base= m.base;
  54. }
  55.  
  56. Metric Metric::Inset(Point e)
  57. {
  58.     extent-= 2*e;
  59.     base-= e.y;
  60.     return *this;
  61. }
  62.  
  63. Metric Metric::Expand(Point e)
  64. {
  65.     extent+= 2*e;
  66.     base+= e.y;
  67.     return *this;
  68. }
  69.  
  70. Metric Metric::Merge(const Metric &m)
  71. {
  72.     extent.x= max(extent.x, m.extent.x);
  73.     base= max(base, m.base);
  74.     int descender= max(extent.y-base, m.extent.y-m.base);
  75.     extent.y= base+descender;
  76.     return *this;
  77. }
  78.  
  79. Metric Metric::Cat(Direction d, const Metric &m, const Point &gap)
  80. {
  81.     if (d == eVert) {
  82.     extent.x= max(extent.x, m.extent.x);
  83.     extent.y+= m.extent.y + gap.y;
  84.     base= extent.y;
  85.     } else {        // eHor
  86.     base= max(base, m.base);
  87.     extent.x+= m.extent.x + gap.x;
  88.     extent.y= base+max(extent.y-base, m.extent.y-m.base);
  89.     }
  90.     return *this;
  91. }
  92.  
  93. Metric HCat(const Metric &m1, const Metric &m2, int hgap)
  94. {
  95.     Metric m;
  96.     m.base= max(m1.base, m2.base);
  97.     m.extent.x= m1.extent.x + m2.extent.x + hgap;
  98.     m.extent.y= m.base+max(m1.extent.y-m1.base, m2.extent.y-m2.base);
  99.     return m;
  100. }
  101.  
  102. Metric VCat(const Metric &m1, const Metric &m2, int vgap)
  103. {
  104.     Metric m;
  105.     m.extent.x= max(m1.extent.x, m2.extent.x);
  106.     m.base= m.extent.y= m1.extent.y + m2.extent.y + vgap;
  107.     // m.base= m.extent.y/2;
  108.     return m;
  109. }
  110.  
  111. Metric Cat(Direction d, const Metric &m1, const Metric &m2, Point gap)
  112. {
  113.     if (d == eVert)
  114.     return VCat(m1, m2, gap.y);
  115.     return HCat(m1, m2, gap.x);
  116. }
  117.  
  118. Metric Min(const Metric &m1, const Metric &m2)
  119. {
  120.     Metric m;
  121.     m.extent.x= min(m1.extent.x, m2.extent.x);
  122.     m.base= min(m1.base, m2.base);
  123.     int descender= min(m1.extent.y-m1.base, m2.extent.y-m2.base);
  124.     m.extent.y= descender+m.base;
  125.     return m;
  126. }
  127.  
  128. Metric Max(const Metric &m1, const Metric &m2)
  129. {
  130.     Metric m;
  131.     m.extent.x= max(m1.extent.x, m2.extent.x);
  132.     m.base= max(m1.base, m2.base);
  133.     int descender= max(m1.extent.y-m1.base, m2.extent.y-m2.base);
  134.     m.extent.y= descender+m.base;
  135.     return m;
  136. }     
  137.  
  138.